package facade.source;

/**
 * 外观模式：
 * 为子系统中的一组接口提供一个一致的界面，
 * 此模式定义了一个高层接口，这个接口使得这一子系统更加容易使用
 *
 * 外观类 -- 需要了解所有的子系统的方法或属性，进行组合，以备外界调用
 * 应用场景：
 * 1.设计初期阶段，在层与层之间(如业务逻辑层与视图层)，建立外观Facade，为复杂的子系统提供一个简单的接口，降低耦合
 * 2.开发阶段，随着开发进行，子系统变得异常庞大复杂。此时通过facade提供简单的接口减少依赖
 * 3.维护一个遗留的大型系统(通常意味着重要但是难以维护与扩展)时，可以为其增加一个facade接口，向下与遗留系统交互，向上与新系统交互
 * @author Chen Guang
 * @date 2019/4/9 0009 上午 9:37
 */
public class Facade {
    private SubSystemOne subSystemOne;
    private SubSystemTwo subSystemTwo;
    private SubSystemThree subSystemThree;
    private SubSystemFour subSystemFour;

    public Facade() {
        this.subSystemOne = new SubSystemOne();
        this.subSystemTwo = new SubSystemTwo();
        this.subSystemThree = new SubSystemThree();
        this.subSystemFour = new SubSystemFour();
    }

    public void methodA(){
        System.out.println("---A组方法---");
        subSystemOne.methodOne();
        subSystemTwo.methodTwo();
    }

    public void methodB(){
        System.out.println("---B组方法---");
        subSystemThree.methodThree();
        subSystemFour.methodFour();
    }
}
